import util from './utils.holdtime.js'
import axios from 'axios'
import Vue from 'vue'
import { baseURL } from '@/config'
import router from '@/router'
import './vantUI'
// 封装成vue的plugin, 使用Vue.use(xxx)调用
const AxiosInse = {
  install: (Vue, options) => {
    let axiosIns = axios.create(options)

    Vue.prototype.$http = {
    /**
     * get(url,[data],[success],[type])
     * url:待载入页面的URL地址
     * data:待发送 Key/value 参数。
     * success:载入成功时回调函数。
     * type:返回内容格式，'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认'json'
     */
      get: (url, data, success, type) => {
        // eslint-disable-next-line no-tabs
        if (util.isFunction(data)) {
          type = type || success
          success = data
          data = undefined
        }

        return axiosIns.get(url, {
          params: util.isObject(data) ? data : {},
          responseType: util.isString(type) ? type : 'json'
        }).then((response) => {
          if (util.isFunction(success)) {
            success.call(Vue, response.data, response.status, response)
          }
        })
      },
      getPromise: (url, data, type) => {
        console.log(url, data, type)
        return new Promise((resolve, reject) => {
          axiosIns.get(url, {
            params: util.isObject(data) ? data : {},
            responseType: util.isString(type) ? type : 'json'
          })
              .then(response => {
                resolve(response.data);
              })
              .catch(error => {
                reject(error);
              });
        })
      },
      /**
       * delete(url,[success],[type])
       * url:发送请求地址。
       * callback:发送成功时回调函数。
       * type:返回内容格式，'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认'json'
       */
      delete: (url, success, type) => {
        return axiosIns.delete(url, {
          responseType: util.isString(type) ? type : 'json'
        }).then((response) => {
          if (util.isFunction(success)) {
            success.call(Vue, response.data, response.status, response)
          }
        })
      },
      /**
       * head(url,[success],[type])
       * url:发送请求地址。
       * callback:发送成功时回调函数。
       * type:返回内容格式，'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认'json'
       */
      head: (url, success, type) => {
        return axiosIns.head(url, {
          responseType: util.isString(type) ? type : 'json'
        }).then((response) => {
          if (util.isFunction(success)) {
            success.call(Vue, response.data, response.status, response)
          }
        })
      },
      /**
       * post(url,[data],[success],[type])
       * url:发送请求地址。
       * data:待发送 Key/value 参数。
       * callback:发送成功时回调函数。
       * type:返回内容格式，'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认'json'
       */
      post: (url, data, success, type) => {
        if (util.isFunction(data)) {
          type = type || success
          success = data
          data = undefined
        }

        return axiosIns.post(url, util.isObject(data) ? data : {}, {
          responseType: util.isString(type) ? type : 'json'
        }).then((response) => {
          if (util.isFunction(success)) {
            success.call(Vue, response.data, response.status, response)
          }
        })
      },
      postPromise: (url, data) => {
        return new Promise((resolve, reject) => {
          return axiosIns.post(url, util.isObject(data) ? data : {}).then((response) => {
            if(response.code === 0) {
              resolve(response.data)
            } else {
              resolve(response.data)
            }
          }).catch(e => {
            reject(e)
          })
        })
      },
      /**
       * put(url,[data],[success],[type])
       * url:发送请求地址。
       * data:待发送 Key/value 参数。
       * callback:发送成功时回调函数。
       * type:返回内容格式，'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认'json'
       */
      put: (url, data, success, type) => {
        if (util.isFunction(data)) {
          type = type || success
          success = data
          data = undefined
        }

        return axiosIns.put(url, util.isObject(data) ? data : {}, {
          responseType: util.isString(type) ? type : 'json'
        }).then((response) => {
          if (util.isFunction(success)) {
            success.call(Vue, response.data, response.status, response)
          }
        })
      },
      putPromise: (url, data) => {
        return new Promise((resolve, reject) => {
          return axiosIns.put(url, util.isObject(data) ? data : {}).then((response) => {
            if(response.code === 0) {
              resolve(response.data)
            } else {
              reject(response.data)
            }
          }).catch(e => {
            reject(e)
          })
        })
      },
      /**
       * patch(url,[data],[success],[type])
       * url:发送请求地址。
       * data:待发送 Key/value 参数。
       * callback:发送成功时回调函数。
       * type:返回内容格式，'arraybuffer', 'blob', 'document', 'json', 'text', 'stream', 默认'json'
       */
      patch: (url, data, success, type) => {
        if (util.isFunction(data)) {
          type = type || success
          success = data
          data = undefined
        }

        return axiosIns.patch(url, util.isObject(data) ? data : {}, {
          responseType: util.isString(type) ? type : 'json'
        }).then((response) => {
          if (util.isFunction(success)) {
            success.call(Vue, response.data, response.status, response)
          }
        })
      },
      __axios: axiosIns
    }

    // 添加请求拦截器
    axiosIns.interceptors.request.use((config) => {
      return config
    }, (error) => {
      // 对请求错误做些什么
      console.error('请求异常', error)
      return Promise.reject(error)
    })

    // 添加响应拦截器
    axiosIns.interceptors.response.use(async response => {
      // 对响应数据做点什么
      return response
    }, (error) => {
      console.log(error)
      // 对响应错误做点什么
      if (error.response) {
        if (error.response.status === 401) {
          Vue.prototype.$toast('登陆超时，请重新登陆！')
          router.push('/')
        } else {
          Vue.prototype.$toast('服务器异常！')
        }
        console.error('响应异常', error)
      } else {
        Vue.prototype.$toast('网络异常，请检查网络！')
      }
    })
  }
}

Vue.use(AxiosInse, {
  baseURL: baseURL,
  withCredentials: true
})

const $http = Vue.prototype.$http

export default $http
